package xy.redis.util;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @Classname ValueRedisUtil
 * @Description TODO
 * @Date 2023/7/17 10:33
 * @Created by wangxianlin
 */
@Component
public class ValueRedisUtil {

    @Resource
    RedisTemplate redisTemplate;

    /**
     *
     * @param key
     * @param value
     */
    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 只在键 key 不存在的情况下， 将键 key 的值设置为 value 。
     * 若键 key 已经存在， 则 SETNX 命令不做任何动作。
     * @param key
     * @param value
     */
    public void setNx(String key, Object value) {
        redisTemplate.opsForValue().setIfAbsent(key, value);
    }

    /**
     * 将键 key 的值设置为 value ， 并将键 key 的生存时间设置为 seconds 秒钟
     * 如果键 key 已经存在， 那么 SETEX 命令将覆盖已有的值。
     * @param key
     * @param value
     * @param time
     */
    public void setEx(String key, Object value,Long time) {
        redisTemplate.opsForValue().set(key, value,time,TimeUnit.SECONDS);
    }

    /**
     * 返回与键 key 相关联的字符串值。
     * @param key
     */
    public Object get(String key) {
       return  redisTemplate.opsForValue().get(key);
    }

    /**
     * 将键 key 的值设为 value ， 并返回键 key 在被设置之前的旧值。
     * @param key
     * @param value
     */
    public void getSet(String key, Object value) {
        redisTemplate.opsForValue().getAndSet(key, value);
    }

    /**
     * 返回键 key 储存的字符串值的长度。
     */
    public void strLen(String key) {
        redisTemplate.opsForValue().size(key);
    }


    /**
     * 为键 key 储存的数字值加上一。
     * @param key
     */
    public void incr(String key) {
        redisTemplate.opsForValue().increment(key);
    }

    /**
     * 为键 key 储存的数字值加上增量 increment 。
     * 如果键 key 不存在， 那么键 key 的值会先被初始化为 0 ， 然后再执行 INCRBY 命令。
     * @param key
     * @param incr
     */
    public void incrBy(String key,double incr) {
        redisTemplate.opsForValue().increment(key,incr);
    }

    /**
     * 为键 key 储存的数字值加上增量 increment 。
     * 如果键 key 不存在， 那么键 key 的值会先被初始化为 0 ， 然后再执行 INCRBY 命令。
     * @param key
     * @param incr
     */
    public void incrBy(String key,long incr) {
        redisTemplate.opsForValue().increment(key,incr);
    }

    /**
     * 为键 key 储存的数字值减去一。
     * @param key
     */
    public void decr(String key) {
        redisTemplate.opsForValue().decrement(key);
    }

    public void decrBy(String key,long incr) {
        redisTemplate.opsForValue().decrement(key,incr);
    }
}
